var validateRegExp = {
	decmal: "^([+-]?)\\d*\\.\\d+$", //浮点数
	decmal1: "^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$", //正浮点数
	decmal2: "^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$", //负浮点数
	decmal3: "^-?([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0)$", //浮点数
	decmal4: "^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$", //非负浮点数（正浮点数 + 0）
	decmal5: "^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$", //非正浮点数（负浮点数 + 0）
	intege: "^-?[1-9]\\d*$", //整数
	intege1: "^[1-9]\\d*$", //正整数
	intege2: "^-[1-9]\\d*$", //负整数
	num: "^([+-]?)\\d*\\.?\\d+$", //数字
	num1: "^[1-9]\\d*|0$", //正数（正整数 + 0）
	num2: "^-[1-9]\\d*|0$", //负数（负整数 + 0）
	ascii: "^[\\x00-\\xFF]+$", //仅ACSII字符
	chinese: "^[\\u4e00-\\u9fa5]+$", //仅中文
	color: "^[a-fA-F0-9]{6}$", //颜色
	date: "^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$", //日期
	email: "^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$", //邮件
	idcard: "^[1-9]([0-9]{14}|[0-9]{17})$", //身份证
	ip4: "^(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)$", //ip地址
	letter: "^[A-Za-z]+$", //字母
	letter_l: "^[a-z]+$", //小写字母
	letter_u: "^[A-Z]+$", //大写字母
	mobile: "^0?(13|15|18)[0-9]{9}$", //手机
	notempty: "^\\S+$", //非空
	password: "^.*[A-Za-z0-9\\w_-]+.*$", //密码
	fullNumber: "^[0-9]+$", //数字
	picture: "(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$", //图片
	qq: "^[1-9]*[1-9][0-9]*$", //QQ号码
	rar: "(.*)\\.(rar|zip|7zip|tgz)$", //压缩文件
	tel: "^[0-9\-()（）]{7,18}$", //电话号码的函数(包括验证国内区号,国际区号,分机号)
	url: "^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$", //url
	username: "^[A-Za-z0-9_\\-\\u4e00-\\u9fa5]+$", //用户名
	deptname: "^[A-Za-z0-9_()（）\\-\\u4e00-\\u9fa5]+$", //单位名
	zipcode: "^\\d{6}$", //邮编
	realname: "^[A-Za-z\\u4e00-\\u9fa5]+$", // 真实姓名
	companyname: "^[A-Za-z0-9_()（）\\-\\u4e00-\\u9fa5]+$",
	companyaddr: "^[A-Za-z0-9_()（）\\#\\-\\u4e00-\\u9fa5]+$",
	companysite: "^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&#=]*)?$"
};

//主函数
(function($) {
	$.fn.jdValidate = function(option, callback, def) {
		var ele = this;
		var id = ele.attr("id");
		var type = ele.attr("type");
		var rel = ele.attr("rel");
		var _onFocus = $("#" + id + validateSettings.onFocus.container);
		var _succeed = $("#" + id + validateSettings.succeed.container);
		var _isNull = $("#" + id + validateSettings.isNull.container);
		var _error = $("#" + id + validateSettings.error.container);
		if (def == true) {
			var str = ele.val();
			var tag = ele.attr("sta");
			if (str == "" || str == "-1") {
				validateSettings.isNull.run({
					prompts: option,
					element: ele,
					isNullEle: _isNull,
					succeedEle: _succeed
				}, option.isNull);
			} else if (tag == 1 || tag == 2) {
				return;
			} else {
				callback({
					prompts: option,
					element: ele,
					value: str,
					errorEle: _error,
					succeedEle: _succeed
				});
			}
		} else {
			if (typeof def == "string") {
				ele.val(def);
			}
			if (type == "checkbox" || type == "radio") {
				if (ele.attr("checked") == true) {
					ele.attr("sta", validateSettings.succeed.state);
				}
			}
			switch (type) {
				case "text":
				case "password":
					ele.bind("focus", function() {
							var str = ele.val();
							if (str == def) {
								ele.val("");
							}
							if (id == "pwd") {
								$("#pwdstrength").hide();
							}
							validateSettings.onFocus.run({
								prompts: option,
								element: ele,
								value: str,
								onFocusEle: _onFocus,
								succeedEle: _succeed
							}, option.onFocus);
						})
						.bind("blur", function() {
							var str = ele.val();
							if (str == "") {
								ele.val(def);
							}
							if (validateRules.isNull(str)) {
								validateSettings.isNull.run({
									prompts: option,
									element: ele,
									value: str,
									isNullEle: _isNull,
									succeedEle: _succeed
								}, "");
							} else {
								callback({
									prompts: option,
									element: ele,
									value: str,
									errorEle: _error,
									isNullEle: _isNull,
									succeedEle: _succeed
								});
							}
						});
					break;
				default:
					if (rel && rel == "select") {
						ele.bind("change", function() {
							var str = ele.val();
							callback({
								prompts: option,
								element: ele,
								value: str,
								errorEle: _error,
								isNullEle: _isNull,
								succeedEle: _succeed
							});
						})
					} else {
						ele.bind("click", function() {
							callback({
								prompts: option,
								element: ele,
								errorEle: _error,
								isNullEle: _isNull,
								succeedEle: _succeed
							});
						})
					}
					break;
			}
		}
	}
})(jQuery);

//配置
var validateSettings = {
	onFocus: {
		state: null,
		container: "_error",
		style: "focus",
		run: function(option, str) {
			if (!validateRules.checkType(option.element)) {
				option.element.removeClass(validateSettings.INPUT_style2).addClass(validateSettings
					.INPUT_style1);
			}
			option.onFocusEle.removeClass().addClass(validateSettings.onFocus.style).html(str);
		}
	},
	isNull: {
		state: 0,
		container: "_error",
		style: "null",
		run: function(option, str) {
			option.element.attr("sta", 0);
			if (!validateRules.checkType(option.element)) {
				if (str != "") {
					option.element.removeClass(validateSettings.INPUT_style1).addClass(validateSettings
						.INPUT_style2);
				} else {
					option.element.removeClass(validateSettings.INPUT_style2).removeClass(validateSettings
						.INPUT_style1);
				}
			}
			option.succeedEle.removeClass(validateSettings.succeed.style);
			option.isNullEle.removeClass().addClass(validateSettings.isNull.style).html(str);
		}
	},
	error: {
		state: 1,
		container: "_error",
		style: "error",
		run: function(option, str) {
			option.element.attr("sta", 1);
			if (!validateRules.checkType(option.element)) {
				option.element.removeClass(validateSettings.INPUT_style1).addClass(validateSettings
					.INPUT_style2);
			}
			option.succeedEle.removeClass(validateSettings.succeed.style);
			option.errorEle.removeClass().addClass(validateSettings.error.style).html(str);
		}
	},
	succeed: {
		state: 2,
		container: "_succeed",
		style: "succeed",
		run: function(option) {
			option.element.attr("sta", 2);
			option.errorEle.empty();
			if (!validateRules.checkType(option.element)) {
				option.element.removeClass(validateSettings.INPUT_style1).removeClass(validateSettings
					.INPUT_style2);
			}
			if (option.element.attr("id") == "schoolinput" && $("#schoolid").val() == "") {
				return;
			}
			option.succeedEle.addClass(validateSettings.succeed.style);
		}
	},
	INPUT_style1: "highlight1",
	INPUT_style2: "highlight2"

};

//验证规则
var validateRules = {
	isNull: function(str) {
		return (str == "" || typeof str != "string");
	},
	betweenLength: function(str, _min, _max) {
		return (str.length >= _min && str.length <= _max);
	},
	isUid: function(str) {
		return new RegExp(validateRegExp.username).test(str);
	},
	fullNumberName: function(str) {
		return new RegExp(validateRegExp.fullNumber).test(str);
	},
	isPwd: function(str) {
		return /^.*([\W_a-zA-z0-9-])+.*$/i.test(str);
	},
	isPwd2: function(str1, str2) {
		return (str1 == str2);
	},
	isEmail: function(str) {
		return new RegExp(validateRegExp.email).test(str);
	},
	isTel: function(str) {
		return new RegExp(validateRegExp.tel).test(str);
	},
	isMobile: function(str) {
		return new RegExp(validateRegExp.mobile).test(str);
	},
	checkType: function(element) {
		return (element.attr("type") == "checkbox" || element.attr("type") == "radio" || element.attr("rel") ==
			"select");
	},
	isChinese: function(str) {
		return new RegExp(validateRegExp.chinese).test(str);
	},
	isRealName: function(str) {
		return new RegExp(validateRegExp.realname).test(str);
	},
	isDeptname: function(str) {
		return new RegExp(validateRegExp.deptname).test(str);
	},
	isCompanyname: function(str) {
		return new RegExp(validateRegExp.companyname).test(str);
	},
	isCompanyaddr: function(str) {
		return new RegExp(validateRegExp.companyaddr).test(str);
	},
	isCompanysite: function(str) {
		return new RegExp(validateRegExp.companysite).test(str);
	},
	isQQ: function(str) {
		return new RegExp(validateRegExp.qq).test(str);
	}
};
//验证文本
var validatePrompt = {
	username: {
		onFocus: "4-20位字符，可由中文、英文、数字及“_”、“-”组成",
		succeed: "",
		isNull: "请输入用户名",
		error: {
			beUsed: "该用户名已被使用，请使用其它用户名注册，如果您是&quot;{1}&quot;，请<a href='./register.html' class='flk13'>登录</a>",
			badLength: "用户名长度只能在4-20位字符之间",
			badFormat: "用户名只能由中文、英文、数字及“_”、“-”组成",
			fullNumberName: "用户名不能全为数字",
			nullName: "用户名不能为空",
		}
	},
	pwd: {
		onFocus: "6-16位字符，可由英文、数字及标点符号组成",
		succeed: "",
		isNull: "请输入密码",
		error: {
			badLength: "密码长度只能在6-16位字符之间",
			badFormat: "密码只能由英文、数字及标点符号组成"
		}
	},
	pwd2: {
		onFocus: "请再次输入密码",
		succeed: "",
		isNull: "请输入密码",
		error: {
			badLength: "密码长度只能在6-16位字符之间",
			badFormat2: "两次输入密码不一致",
			badFormat1: "密码只能由英文、数字及标点符号组成"
		}
	},
	mail: {
		onFocus: "请输入常用的邮箱，将用来登陆账号、找回密码等",
		succeed: "",
		isNull: "请输入邮箱",
		error: {
			beUsed: "该邮箱已被使用，请更换其它邮箱，或使用该邮箱<a href='./register.html' class='flk13'>登录</a>",
			badFormat: "邮箱格式不正确",
			badLength: "您填写的邮箱过长，邮件地址只能在50个字符以内"
		}
	},
	mobile: {
		onFocus: "请填写大陆手机号",
		succeed: "",
		isNull: "请输入您的手机号码",
		error: "手机号格式错误，请重新输入"
	},
	QQnum: {
		onFocus: "请输入6-10位数的QQ号",
		succeed: "",
		isNull: "请输入QQ号",
		error: {
			badFormat: "QQ号格式错误，请重新输入",
			badLength: "您填写的QQ号位数不对"
		}
	},
	authcode: {
		onFocus: "请输入图片中的字符，不区分大小写",
		succeed: "",
		isNull: "请输入验证码",
		error: "验证码错误"
	},
	protocol: {
		onFocus: "",
		succeed: "",
		isNull: "请先阅读并同意《京东商城用户协议》",
		error: ""
	},
	referrer: {
		onFocus: "如您注册并完成订单，推荐人有机会获得积分",
		succeed: "",
		isNull: "",
		error: ""
	},
	schoolinput: {
		onFocus: "您可以用简拼、全拼、中文进行校名模糊查找",
		succeed: "",
		isNull: "请填选学校名称",
		error: "请填选学校名称"
	},
	empty: {
		onFocus: "",
		succeed: "",
		isNull: "",
		error: ""
	}
};

var nameold, emailold, authcodeold;
var namestate = false,
	emailstate = false,
	authcodestate = false;
//回调函数
var validateFunction = {
	username: function(option) {
		$(".username i").css("color", "white");
		var format = validateRules.isUid(option.value);
		var length = validateRules.betweenLength(option.value.replace(/[^\x00-\xff]/g, "**"), 4, 20);
		if (!length && format) {
			validateSettings.error.run(option, option.prompts.error.badLength);
			$(".username i").css("color", "#f84c00");
		} else if (!length && !format) {
			$(".username i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error.badFormat);
		} else if (length && !format) {
			$(".username i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error.badFormat);
		} else if (validateRules.fullNumberName(option.value)) {
			$(".username i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error.fullNumberName);
		} else {
			if (!namestate || nameold != option.value) {
				if (nameold != option.value) {
					// nameold = option.value;
					option.errorEle.html("<span style='color:#999'>检验中……</span>");
					// $.getJSON("AjaxService.aspx?action=CheckUnicknme&uid=" + escape(option.value) + "&r=" + Math
					// 	.random(),
					// 	function(date) {
					// 		if (date.success == 0) {
					// 			validateSettings.succeed.run(option);
					// $(".username i").css("color", "#28f328");
					// 			namestate = true;
					// 		} else {
					// 			validateSettings.error.run(option, option.prompts.error.beUsed.replace(
					// 				"{1}", option.value));
					// $(".username i").css("color", "#f84c00");
					// 			namestate = false;
					// 		}
					// 	})
					validateSettings.succeed.run(option);
					namestate = true;
					$(".username i").css("color", "#28f328");
				} else {
					validateSettings.error.run(option, option.prompts.error.beUsed.replace("{1}", option
						.value));
					namestate = false;
					$(".username i").css("color", "#f84c00");
				}
			} else {
				$(".username i").css("color", "#28f328");
				validateSettings.succeed.run(option);
			}
		}
	},
	pwd: function(option) {
		$(".pswd i").css("color", "white");
		$(".pswd #viewpwd").css("color", "#000000");
		var str1 = option.value;
		var str2 = $("#pwd2").val();
		var format = validateRules.isPwd(option.value);
		var length = validateRules.betweenLength(option.value, 6, 16);
		$("#pwdstrength").hide();
		if (!length && format) {
			$(".pswd i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error.badLength);
		} else if (!length && !format) {
			$(".pswd i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error.badFormat);
		} else if (length && !format) {
			$(".pswd i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error.badFormat);
		} else {
			validateSettings.succeed.run(option);
			validateFunction.pwdstrength();
			$(".pswd i").css("color", "#28f328");
		}
		if (str2 == str1) {
			$("#pwd2").focus();
		}
	},
	pwd2: function(option) {
		$(".epswd i").css("color", "white");
		var str1 = option.value;
		var str2 = $("#pwd").val();
		var length = validateRules.betweenLength(option.value, 6, 16);
		var format2 = validateRules.isPwd2(str1, str2);
		var format1 = validateRules.isPwd(str1);
		if (!length) {
			$(".epswd i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error.badLength);
		} else {
			if (!format1) {
				$(".epswd i").css("color", "#f84c00");
				validateSettings.error.run(option, option.prompts.error.badFormat1);
			} else {
				if (!format2) {
					$(".epswd i").css("color", "#f84c00");
					validateSettings.error.run(option, option.prompts.error.badFormat2);
				} else {
					validateSettings.succeed.run(option);
					$(".epswd i").css("color", "#28f328");
				}
			}
		}
	},
	mail: function(option) {
		$(".e-mail i").css("color", "white");
		var format = validateRules.isEmail(option.value);
		var format2 = validateRules.betweenLength(option.value, 0, 50);
		if (!format) {
			$(".e-mail i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error.badFormat);
		} else {
			if (!format2) {
				$(".e-mail i").css("color", "#f84c00");
				validateSettings.error.run(option, option.prompts.error.badLength);
			} else {
				if (!emailstate || emailold != option.value) {
					if (emailold != option.value) {
						// emailold = option.value;
						option.errorEle.html("<span style='color:#999'>检验中……</span>");
						// $.getJSON("AjaxService.aspx?action=CheckUemail&str=" + escape(option.value) + "&r=" +
						// 	Math.random(),
						// 	function(date) {
						// 		if (date.success == 0) {
						// 			$(".e-mail i").css("color", "#28f328");
						// 			validateSettings.succeed.run(option);
						// 			emailstate = true;
						// 		} else {
						// 			$(".e-mail i").css("color", "#f84c00");
						// 			validateSettings.error.run(option, option.prompts.error.beUsed);
						// 			emailstate = false;
						// 		}
						// 	})
						$(".e-mail i").css("color", "#28f328");
						validateSettings.succeed.run(option);
						emailstate = true;
					} else {
						$(".e-mail i").css("color", "#f84c00");
						validateSettings.error.run(option, option.prompts.error.beUsed);
						emailstate = false;
					}
				} else {
					$(".e-mail i").css("color", "#28f328");
					validateSettings.succeed.run(option);
				}
			}
		}
	},
	mobile: function(option) {
		$(".phonenum i").css("color", "white");
		var format = validateRules.isMobile(option.value);
		if (!format) {
			$(".phonenum i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error);
		} else {
			validateSettings.succeed.run(option);
			$(".phonenum i").css("color", "#28f328");
		}
	},
	qqnum: function(option) {
		$(".QQnum i").css("color", "white");
		var format = validateRules.isQQ(option.value);
		var length = validateRules.betweenLength(option.value, 6, 10);
		if(!length){
			$(".QQnum i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error.badLength);
		} else if (!format && length) {
			$(".QQnum i").css("color", "#f84c00");
			validateSettings.error.run(option, option.prompts.error.badFormat);
		} else {
			validateSettings.succeed.run(option);
			$(".QQnum i").css("color", "#28f328");
		}
	},
	referrer: function(option) {
		var bool = validateRules.isNull(option.value);
		if (bool) {
			option.element.val("可不填");
			return;
		} else {
			validateSettings.succeed.run(option);
		}
	},
	schoolinput: function(option) {
		var bool = validateRules.isNull(option.value);
		if (bool) {
			validateSettings.error.run(option, option.prompts.error);
			return;
		} else {
			validateSettings.succeed.run(option);
		}
	},
	authcode: function(option) {
		//        if (!authcodestate || authcodeold != option.value) {
		//            if (authcodeold != option.value) {
		// //                authcodeold = option.value;
		// //                option.errorEle.html("<span style='color:#999'>检验中……</span>");
		// //                var uuid = $("#JD_Verification1").attr("src").split("&uid=")[1].split("&")[0];
		// //                $.getJSON("AjaxService.aspx?action=CheckAuthcode&str=" + escape(option.value) + "&r=" + Math.random() + "&uuid=" + uuid, function(date) {
		// //                    if (date.success == 0) {
		// //                        validateSettings.succeed.run(option);
		// //                        authcodestate = true;
		// //                    } else {
		// //                        validateSettings.error.run(option, option.prompts.error);
		// //                        authcodestate = false;
		// //                    }
		// //                })
		//            }
		//            else {
		//                validateSettings.error.run(option, option.prompts.error);
		//                authcodestate = false;
		//            }
		//        }
		//        else {
		//            validateSettings.succeed.run(option);
		//        }

		validateSettings.succeed.run(option);
		authcodestate = true;
	},
	protocol: function(option) {
		if (option.element.attr("checked") == true) {
			option.element.attr("sta", validateSettings.succeed.state);
			option.errorEle.html("");
		} else {
			option.element.attr("sta", validateSettings.isNull.state);
			option.succeedEle.removeClass(validateSettings.succeed.style);
		}
	},
	pwdstrength: function() {

		var element = $("#pwdstrength");
		var value = $("#pwd").val();
		if (value.length >= 6 && validateRules.isPwd(value)) {
			$("#pwd_error").empty();
			element.show();

			var pattern_1 = /^.*([\W_])+.*$/i;
			var pattern_2 = /^.*([a-zA-Z])+.*$/i;
			var pattern_3 = /^.*([0-9])+.*$/i;
			var level = 0;

			if (value.length > 10) {
				level++;
			}

			if (pattern_1.test(value)) {
				level++;
			}

			if (pattern_2.test(value)) {
				level++;
			}

			if (pattern_3.test(value)) {
				level++;
			}

			if (level > 3) {
				level = 3;
			}

			switch (level) {
				case 1:
					element.removeClass().addClass("strengthA");
					break;
				case 2:
					element.removeClass().addClass("strengthB");
					break;
				case 3:
					element.removeClass().addClass("strengthC");
					break;
				default:
					break;
			}
		} else {
			element.hide();
		}
	},
	checkGroup: function(elements) {
		for (var i = 0; i < elements.length; i++) {
			if (elements[i].checked) {
				return true;
			}
		}
		return false;
	},
	checkSelectGroup: function(elements) {
		for (var i = 0; i < elements.length; i++) {
			if (elements[i].value == -1) {
				return false;
			}
		}
		return true;
	},
	showPassword: function(type) {
		var v1 = $("#pwd").val(),
			s1 = $("#pwd").attr("sta"),
			c1 = document.getElementById("pwd").className,
			t1 = $("#pwd").attr("placeholder");
		var v2 = $("#pwd2").val(),
			s2 = $("#pwd2").attr("sta"),
			c2 = document.getElementById("pwd2").className,
			t2 = $("#pwd2").attr("placeholder");
		var P1 = $("<input type='" + type + "' value='" + v1 + "' sta='" + s1 + "' class='" + c1 +
			"' id='pwd' placeholder='" + t1 + "'/>");
		$("#pwd").after(P1).remove();
		$("#pwd").bind("keyup",
			function() {
				validateFunction.pwdstrength();
			}).jdValidate(validatePrompt.pwd, validateFunction.pwd)
		var P2 = $("<input type='" + type + "' value='" + v2 + "' sta='" + s2 + "' class='" + c2 +
			"' id='pwd2' placeholder='" + t2 + "'/>");
		$("#pwd2").after(P2).remove();
		$("#pwd2").jdValidate(validatePrompt.pwd2, validateFunction.pwd2);
	},
	FORM_submit: function(elements) {
		var bool = true;
		for (var i = 0; i < elements.length; i++) {
			if ($(elements[i]).attr("sta") == 2) {
				bool = true;
			} else {
				bool = false;
				break;
			}
		}
		return bool;
	}
};
